home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #2 / Ham Radio 2000 - Volume 2.iso / HAMV2 / MISC / RF / FET.OLD < prev    next >
Encoding:
Text File  |  1996-06-22  |  9.2 KB  |  298 lines

  1. #include "out.h"
  2. #ifndef NO_9
  3. #include <math.h>
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include "all.h"
  7.  
  8.  
  9. void FET_amp()
  10. {
  11.  
  12.     struct S_parameters Snew;
  13.     static int run_first_time=0;
  14.     char *filename, what='g';
  15.     struct S device;
  16.     struct s noise;
  17.     static struct components values;
  18.     int swap;
  19.     if(run_first_time==0)
  20.     {
  21.         values.Vcc=12.0;
  22.         values.Vds=3.0;
  23.         values.Vgs=0.1;
  24.         values.f=145.0;
  25.         values.Id=3.0;
  26.         values.Zo=Zo_default;
  27.         run_first_time=1;
  28.     }
  29.     filename=string(0L,20L);
  30.     FET_amp_picture();
  31.     get_FET_data_from_keyboard(filename, &values, &what);
  32.  
  33.     get_FET_data_from_disk(filename, &device, &noise);
  34.  
  35.     Snew=design_FET_amp(device, noise, &values, what, &swap);
  36.     printf("XXXXXX");
  37.     if(swap==FALSE)
  38.         FET_amp_picture();
  39.     else
  40.         FET_amp_picture2();
  41.     print_FET_component_values(values, Snew);
  42.  
  43.     print_noise_parameters(noise,values.Zo);
  44.     free_string(filename,0L,20L);
  45.     values.f/=1e6;
  46.     values.Id*=1000.0;
  47.     }
  48.  
  49. void FET_amp_picture()
  50. {
  51.     cls();
  52.     printf("                      ----------------Vcc\n");
  53.     printf("                      |\n");
  54.     printf("                      R2\n");
  55.     printf("                      |\n");
  56.     printf("                     RFC\n");
  57.     printf("                      |\n");
  58.     printf("                      |---C2-------X3- O/P\n");
  59.     printf("                      |      |   |\n");
  60.     printf("              G |-----| D    |   |\n");
  61.     printf("I/P----X1-------|            |   |\n");
  62.     printf("           |    |-----| S    R3  X4\n");
  63.     printf("           |          |      |   |\n");
  64.     printf("           |      ----|---   |   |\n");
  65.     printf("          X2      |   |   |  |   |\n");
  66.     printf("           |     Cd   R1 Cd  |   |\n");
  67.     printf("           |      |   |   |  |   |\n");
  68.     printf("  ------------------------------------ Earth \n");
  69. }
  70.  
  71. void FET_amp_picture2()
  72. {
  73.     cls();
  74.     printf("                      ----------------Vcc\n");
  75.     printf("                      |\n");
  76.     printf("                      R2\n");
  77.     printf("                      |\n");
  78.     printf("                     RFC\n");
  79.     printf("                      |\n");
  80.     printf("                      |---C2---X3--- O/P\n");
  81.     printf("              G |-----| D    |    |\n");
  82.     printf("I/P----X1-------|            |    |\n");
  83.     printf("           |    |-----| S    R3  X4\n");
  84.     printf("           |          |      |    |\n");
  85.     printf("           |      ----|---   |    |\n");
  86.     printf("          X2      |   |   |  |    |\n");
  87.     printf("           |     Cd   R1 Cd  |    |\n");
  88.     printf("           |      |   |   |  |    |\n");
  89.     printf("  ------------------------------------ Earth \n");
  90. }
  91.  
  92. struct S_parameters design_FET_amp(struct S device, struct s noise, struct components *values, char what, int *swap)
  93. {
  94.     double r, x, theta, Zo;
  95.     double Rload, Xload;
  96.     struct S_and_Z noise_data;
  97.     struct FCOMPLEX input_Z, temp, zout;
  98.     struct S_parameters a,c, S_ip_matching, FET, newS;
  99.     struct S_parameters series_element, parallel_element;
  100.     struct T_parameters b;
  101.     struct S d;
  102.  
  103.     Zo=values->Zo;
  104.  
  105.     values->R1=values->Vgs/values->Id; /* Id in mA */
  106.     values->R2=(values->Vcc-values->Vds-values->Vgs)/values->Id;
  107.     /* Let each Cd have a reactance 1/5 that of R1 */
  108.     values->Cd=5/(2*PI*values->f*values->R1);
  109.     if(what=='N' || what =='n')
  110.     {
  111.         noise_data.s_in_dB=20*log10(noise.mag);
  112.         noise_data.angle=noise.ang;
  113.         convert(2, &noise_data, Zo);
  114.         r=noise_data.z.r;
  115.         x=noise_data.z.i;
  116.     }
  117.     else if(what=='G' || what =='g')
  118.     {
  119.         noise_data.s_in_dB=20*log10(device.s11.mag);
  120.         noise_data.angle=device.s11.ang;
  121.         convert(2, &noise_data,Zo);
  122.         r=noise_data.z.r;
  123.         x=-noise_data.z.i; /* -X, since need to match to complex conjugate */
  124.     }
  125.     calculate_L_network(values->Zo,0.0,r,x,&values->X1_1, &values->X1_2, &values->X2_1, &values->X2_2, swap);
  126.     if(values->X1_1 >= 0.0) /* X1 inductive */
  127.     {
  128.         values->L1_1=values->X1_1/(2*PI*values->f);
  129.         values->C2_1=-1/(2*PI*values->f*values->X2_1);
  130.         values->C1_2=-1/(2*PI*values->f*values->X1_2);
  131.         values->L2_2=values->X2_2/(2*PI*values->f);
  132.     }
  133.     else
  134.     {
  135.         fprintf(stderr,"Internal error 100 in 'design_FET_amp'\n Exiting ...\n");
  136.         exit(100);
  137.     }
  138.     /* Compute S' of FET and input matching network */
  139.     FET.S11.r=device.s11.mag*cos(device.s11.ang*PI/180.0);
  140.     FET.S11.i=device.s11.mag*sin(device.s11.ang*PI/180.0);
  141.     FET.S12.r=device.s12.mag*cos(device.s12.ang*PI/180.0);
  142.     FET.S12.i=device.s12.mag*sin(device.s12.ang*PI/180.0);
  143.     FET.S21.r=device.s21.mag*cos(device.s21.ang*PI/180.0);
  144.     FET.S21.i=device.s21.mag*sin(device.s21.ang*PI/180.0);
  145.     FET.S22.r=device.s22.mag*cos(device.s22.ang*PI/180.0);
  146.     FET.S22.i=device.s22.mag*sin(device.s22.ang*PI/180.0);
  147.     /* series L or C */
  148.     input_Z.r=0.0; input_Z.i=values->X1_1;
  149.     series_element=series_Z_to_S_par(values->Zo, input_Z);
  150.     /* parallel L or C */
  151.     input_Z.r=0.0; input_Z.i=values->X2_1;
  152.     parallel_element=parallel_Z_to_S_par(values->Zo, input_Z);
  153.     S_ip_matching=S1_and_S2_to_S(series_element,parallel_element);
  154.     newS=S1_and_S2_to_S(S_ip_matching, FET);
  155.     values->C2=1e-13; /* 0.1pF */
  156.     do{
  157.         values->C2=values->C2*3.1622777;
  158.         x=1.0/(2.0*PI* values->f * values->C2);
  159.     }while(x>100.0);
  160.     /* C2's efffect on newS */
  161.     temp.r=0.0; temp.i=-x;
  162.  
  163.     newS=series_Z_to_new_S(Zo, newS, temp);
  164.     /* Add effect of stabilising resistor */
  165.     temp.r=values->R3; temp.i=0.0;
  166.     newS=parallel_Z_to_new_S(Zo, newS, temp);
  167.     S_to_lump(values->Zo,newS.S22,&zout);
  168.     values->X3_1=0.0; values->X3_2=0.0;
  169.     values->X4_1=0.0; values->X4_2=0.0;
  170.     calculate_L_network(values->Zo,0.0,zout.r, -zout.i, &values->X3_1, &values->X3_2, &values->X4_1, &values->X4_2, swap);
  171.     if(*swap==TRUE)
  172.     {
  173.         calculate_L_network(zout.r, zout.i, values->Zo,-0.0,&values->X3_1, &values->X3_2, &values->X4_1, &values->X4_2, swap);
  174.         *swap=TRUE;
  175.     }
  176.     if(values->X3_1 >= 0.0) /* X3 inductive */
  177.         values->L3_1=values->X3_1/(2*PI*values->f);
  178.     if(values->X3_1<0.0)
  179.         values->C3_1=-1/(2*PI*values->f*values->X3_1);
  180.     if(values->X3_2 >= 0.0) /* X3 inductive */
  181.         values->L3_2=values->X3_2/(2*PI*values->f);
  182.     if(values->X3_2<0.0)
  183.         values->C3_2=-1/(2*PI*values->f*values->X3_2);
  184.     if(values->X4_1 >= 0.0) /* X4 inductive */
  185.         values->L4_1=values->X4_1/(2*PI*values->f);
  186.     if(values->X4_1<0.0)
  187.         values->C4_1=-1/(2*PI*values->f*values->X4_1);
  188.     if(values->X4_2 >= 0.0) /* X1 inductive */
  189.         values->L4_2=values->X4_2/(2*PI*values->f);
  190.     if(values->X4_2<0.0)
  191.         values->C4_2=-1/(2*PI*values->f*values->X4_2);
  192.     /* Assume _1's used. Find the final S parameters of network */
  193.     if(*swap==FALSE)
  194.     {
  195.         temp.r=0.0; temp.i=values->X4_1;
  196.         newS=parallel_Z_to_new_S(Zo, newS, temp); /* parallel X4 */
  197.         temp.r=0.0; temp.i=values->X3_1;
  198.         newS=series_Z_to_new_S(Zo, newS, temp); /* series X3 */
  199.     }
  200.     else if(*swap==TRUE)
  201.     {
  202.         temp.r=0.0; temp.i=values->X3_1;
  203.         newS=series_Z_to_new_S(Zo, newS, temp); /* series X3 */
  204.  
  205.         temp.r=0.0; temp.i=values->X4_1;
  206.         newS=parallel_Z_to_new_S(Zo, newS, temp); /* parallel X4 */
  207.     }
  208.     if(what =='G' || what == 'g')
  209.     {
  210.  
  211.         if(*swap==TRUE)
  212.         {
  213.  
  214.         }
  215.         else if(*swap== FALSE )
  216.         {
  217.  
  218.         }
  219.     }
  220.     return(newS);
  221. }
  222.  
  223.  
  224. struct S_parameters parallel_Z_to_new_S(double Zo, struct S_parameters old, struct FCOMPLEX z)
  225. {
  226.     struct S_parameters new, parallel_element;
  227.  
  228.     parallel_element=parallel_Z_to_S_par(Zo, z);
  229.     new=S1_and_S2_to_S(old,parallel_element);
  230.     return(new);
  231. }
  232.  
  233. struct S_parameters series_Z_to_new_S(double Zo, struct S_parameters old, struct FCOMPLEX z)
  234. {
  235.     struct S_parameters new, series_element;
  236.  
  237.     series_element=series_Z_to_S_par(Zo, z);
  238.     new=S1_and_S2_to_S(old,series_element);
  239.     return(new);
  240. }
  241.  
  242. void print_FET_component_values(struct components values, struct S_parameters S)
  243. {
  244.     int p, row=1;
  245.     struct S Snew;
  246.     p=getpage();
  247.     goxy(row,45,p);
  248.     printf("F=%.2lf MHz\n", values.f/1e6);
  249.     goxy(++row,45,p);
  250.     printf("Zo=%.1lf %c\n", values.Zo, 234);
  251.     goxy(++row,45,p);
  252.     printf("Vcc=%.1lf V\n",values.Vcc);
  253.     goxy(++row,45,p);
  254.     printf("Id=%.1lf mA\n",values.Id*1000);
  255.     goxy(++row,45,p);
  256.     printf("Vds=%.1lf V\n",values.Vds);
  257.     goxy(++row,45,p);
  258.     printf("Vgs=%.1lf V\n",values.Vgs);
  259.     goxy(++row,45,p);
  260.     printf("R1=%.1lf Ω\n",values.R1);
  261.     goxy(++row,45,p);
  262.     printf("R2=%.1lf Ω\n",values.R2);
  263.     goxy(++row,45,p);
  264.     printf("R3=%.1lf Ω\n",values.R3);
  265.     goxy(++row,45,p);
  266.     printf("Cd ≥ %.1lf pF\n",values.Cd*1e12);
  267.     goxy(++row,45,p);
  268.     printf("{X1=%.1lf nH AND ",values.L1_1*1e9);
  269.     printf("X2=%.2lf pF} OR\n",values.C2_1*1e12);
  270.     goxy(++row,45,p);
  271.     printf("{X1=%.2lf pF AND ", values.C1_2*1e12);
  272.     printf("X2=%.1lf nH}\n", values.L2_2*1e9);
  273.     goxy(++row,45,p);
  274.     printf("C2=%.2lf pF\n",values.C2*1e12);
  275.     goxy(++row,45,p);
  276.     printf("{X3=%.1lf nH AND ",values.L3_1*1e9);
  277.     printf("X4=%.2lf pF} OR\n",values.C4_1*1e12);
  278.     goxy(++row,45,p);
  279.     printf("{X3=%.2lf pF AND ", values.C3_2*1e12);
  280.     printf("X4=%.1lf nH}\n", values.L4_2*1e9);
  281.     row++;
  282.     goxy(row++,45,p);
  283.     Snew=cartessian_to_cylindrical(S);
  284.     printf("S11 = %.3lf(dB) @ %.2lf°\n",  Snew.s11.magdB, Snew.s11.ang);
  285.     goxy(row++,45,p);
  286.     printf("S12 = %.3lf(dB) @ %.2lf°\n", Snew.s12.magdB, Snew.s12.ang);
  287.     goxy(row++,45,p);
  288.     printf("S21 = %.3lf(dB) @ %.2lf°\n", Snew.s21.magdB, Snew.s21.ang);
  289.     goxy(row++,45,p);
  290.     printf("S22 = %.3lf(dB) @ %.2lf°\n", Snew.s22.magdB, Snew.s22.ang);
  291.     goxy(row++,45,p);
  292.     printf("VSWRin  = %.3lf:1\n", (1+Snew.s11.mag)/(1-Snew.s22.mag));
  293.     goxy(row++,45,p);
  294.     printf("VSWRout = %.3lf:1\n", (1+Snew.s22.mag)/(1-Snew.s22.mag));
  295. }
  296.  
  297. #endif
  298.